package com.zenithmind.note.pojo.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.zenithmind.common.base.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import jakarta.validation.constraints.NotNull;

/**
 * 笔记标签关联实体类
 * 遵循面向对象设计原则：
 * 1. 单一职责：只负责笔记和标签的关联关系
 * 2. 不变性：关联关系一旦建立，关键字段不可修改
 * 3. 数据完整性：确保关联关系的唯一性
 */
@EqualsAndHashCode(callSuper = true)
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Schema(name = "笔记标签关联实体", description = "笔记标签关联实体")
@TableName("note_tag_relation")
public class NoteTagRelation extends BaseEntity {

    @Schema(description = "笔记ID")
    @NotNull(message = "笔记ID不能为空")
    private String noteId;

    @Schema(description = "标签ID")
    @NotNull(message = "标签ID不能为空")
    private String tagId;

    // ==================== 业务方法 ====================

    /**
     * 验证关联关系是否有效
     *
     * @return 是否有效
     */
    public boolean isValid() {
        return this.noteId != null && !this.noteId.trim().isEmpty() &&
               this.tagId != null && !this.tagId.trim().isEmpty();
    }

    /**
     * 判断是否为指定笔记和标签的关联
     *
     * @param noteId 笔记ID
     * @param tagId 标签ID
     * @return 是否匹配
     */
    public boolean matches(String noteId, String tagId) {
        return this.noteId != null && this.noteId.equals(noteId) &&
               this.tagId != null && this.tagId.equals(tagId);
    }

    /**
     * 判断是否属于指定笔记
     *
     * @param noteId 笔记ID
     * @return 是否属于该笔记
     */
    public boolean belongsToNote(String noteId) {
        return this.noteId != null && this.noteId.equals(noteId);
    }

    /**
     * 判断是否使用了指定标签
     *
     * @param tagId 标签ID
     * @return 是否使用该标签
     */
    public boolean usesTag(String tagId) {
        return this.tagId != null && this.tagId.equals(tagId);
    }
}